package it.pir.es02ChatTCP;

import java.io.*;
import java.net.Socket;
import java.util.Map;

public class ServerTxt extends Server {

	public ServerTxt(int port) throws IOException {
		super(port);
	}

	private void printMessage(PrintWriter pw, Message message) {
		pw.println(message.getNickname());
		pw.println(message.getMessage());
		pw.println(message.getType());
		pw.flush();
	}
	
	@Override
	public void broadcastSend(String nickname, Message message) throws IOException {
        chat.addMessage(message.getNickname() + ": "+ message.getMessage());
		//System.out.println(message.getNickname() + ": "+ message.getMessage());
		for(Map.Entry<String, OutputStream> entry : clients.entrySet()) {
			if(!nickname.equals(entry.getKey())) {
				PrintWriter pw = new PrintWriter(new OutputStreamWriter(entry.getValue(), Message.ENCODE));
				printMessage(pw, message);
			}
		}
	}

	@Override
	public void start() {
		BufferedReader bufferedReader;
		while(true) {
			try {
				Socket socket = serverSocket.accept(); // Attendi la connessione di un nuovo client
				InputStream is = socket.getInputStream();
				bufferedReader = new BufferedReader(new InputStreamReader(is, Message.ENCODE));
				String nick = bufferedReader.readLine();
				bufferedReader.readLine();
				int typ = Integer.parseInt(bufferedReader.readLine());

				if(typ == Message.AUTHENTICATION) {
					OutputStream os = socket.getOutputStream();
					PrintWriter pw = new PrintWriter(new OutputStreamWriter(os, Message.ENCODE));
					if(clients.containsKey(nick)) {
						printMessage(pw, new Message("SERVER","ERRORE! Nickname già in uso!", Message.AUTHENTICATION));
						socket.close();
					} else {
						addClient(nick, os); // Aggiungi il client alla lista dei client
						printMessage(pw, new Message("SERVER", "Autenticazione effettuata! Ora sei connesso come " + nick, Message.AUTHENTICATION));
						
						/* Viene eseguito il thread del gestore dei client che invia messaggi a tutti i client*/
						broadcastSend(nick, new Message("SERVER", "L'utente " + nick + " è entrato nella chat.", Message.MESSAGE)); // Invia una notifica a tutti gli altri per notificare che l'utente è entrato in chat

						// Avvia la gestione dei messaggi del nuovo client
						ClientHandler ch = new ClientHandlerTxt(nick, this, is);
						Thread t = new Thread(ch);
						t.start();
					}
				} else {
					// ERRORE: Il primo messaggio deve essere di autenticazione!
					System.out.println("ERRORE!!! L'utente " + nick + " ha inviato un messaggio non valido!");
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}
